/*
 * 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Entidades;

import Limite.Apresentacao;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Collections;

/**
 *
 * @author Ian Rocha
 */
public class Coloracao {

    private ArrayList<No> nos = new ArrayList<No>();
    private ArrayList<Link> links = new ArrayList<Link>();
    private Apresentacao ap = null;
    private ArrayList<Color> cores = new ArrayList<Color>();
    private ArrayList<No> noUsados = new ArrayList<No>();

    public Coloracao(ArrayList<No> nos, ArrayList<Link> links, Apresentacao ap) {
        this.nos = nos;
        this.links = links;
        this.ap = ap;
//        this.cores.add(Color.green);
        this.cores.add(Color.red);
        this.cores.add(Color.blue);
        this.cores.add(Color.yellow);
        this.cores.add(Color.pink);
        this.cores.add(Color.white);
        this.cores.add(Color.orange);
        this.cores.add(Color.black);
        this.cores.add(Color.gray);
        this.cores.add(Color.cyan);
        this.cores.add(Color.magenta);
    }

    public No getNoMaiorGrau(ArrayList<No> nos) {
        ComparatorNoGrau comparator = new ComparatorNoGrau();
        Collections.sort(nos, comparator);
        return nos.get(nos.size() - 1); //retorna o ultimo nó (Grau maior)
    }

    public void execute() {

        No Vi = getNoMaiorGrau(nos);
        noUsados.add(Vi);
        noUsados.addAll(Vi.getAdjacente());

        ArrayList<No> fila = new ArrayList<No>(Vi.getAdjacente()); //Insere na fila todos os adjacentes a o ponto inicial de maior grau
        ap.insereNoNaTela(Vi.getCoordenadaX(), Vi.getCoordenadaY(), Vi.getIdentificador(), Color.red); //pinta o maior grau de verde
        Vi.setCor(Color.red);

        while (!fila.isEmpty()) {

            No n = fila.get(0); //pega o primeiro da fila
            System.out.println("fila: " + fila);
            insereNoFila(fila, n.getAdjacente());

            ap.insereNoNaTela(n.getCoordenadaX(), n.getCoordenadaY(), n.getIdentificador(), colorirNo(n));
            fila.remove(n);
        }
        ArrayList<Integer> intCores = new ArrayList<Integer>();
        for(No n :nos){
           intCores.add(cores.indexOf(n.getCor())+1);
        }
        Collections.sort(intCores);
        ap.jt_tCores.setText(""+intCores.get(intCores.size()-1));
    }

    private void insereNoFila(ArrayList<No> fila, ArrayList<No> array) {
        for (No n : array) {
            if (!noUsados.contains(n)) {
                fila.add(n);
                noUsados.add(n);
            }
        }


    }

    private Color colorirNo(No Vk) { //Verifica se nenhum dos verteces adjacentes possui a cor definida, então colorir o vértice
        boolean podeColorir = false;
        int contAdj = 0;

        ArrayList<No> adjacentes = Vk.getAdjacente();
        ArrayList<Color> corAdj = new ArrayList<Color>();
        boolean pinta = true;
        No n = null;
        for (No adj : adjacentes) {
            corAdj.add(adj.getCor());
        }
        for (Color k : cores) {
            pinta = true;
            for (No adj : adjacentes) {
                n = adj;
                
                System.out.println("CORES: " + k + " X " + adj.getCor()+" . "+adj);
                if (k == adj.getCor()) {
                    pinta = false;
//                    cont++;
                }
            }
            if (pinta==true) {
                Vk.setCor(k);
                return k;
            }
        }

        return Color.green;
    }
}
